//
//  "$Id: Traffic.h 106164 2013-03-15 08:30:38Z zhao_zhiding $"
//
//  Copyright (c)1992-2007, ZheJiang Dahua Technology Stock CO.LTD.
//  All Rights Reserved.
//
//	Description:	
//	Revisions:		Year-Month-Day  SVN-Author  Modification
//

#ifndef __TRAFFIC_API_H__
#define __TRAFFIC_API_H__

#include "Defs.h"
#ifdef TRAFFIC_DRIVER
#include "snaptypes.h"
#else
#include "Types.h"
#endif

#ifdef __cplusplus
extern "C" {
#endif

#define TrafficMaxLanes 8

/*每个违法代码的抓拍张数*/
typedef struct __TRAFFIC_SNAPCNT
{	
	unsigned int SNAP_NORMAL:3;			///< 正常抓拍张数
	unsigned int RED_REAK:3;			///< 穿红灯抓拍张数
	unsigned int OVER_LINE:3;			///< 压线抓拍张数
	unsigned int CONVERSE:3;			///< 逆行抓拍张数
	unsigned int SPEED_LOW:3;			///< 欠速抓拍张数
	unsigned int SPEED_OVER:3;			///< 超速抓拍张数
	unsigned int OCOUPY_WAY:3;			///< 违章占道抓拍张数
	unsigned int YELLOW_OCOUPY_WAY:3;	///< 黄牌占道抓拍张数
	unsigned int YELLOW_REAK:3;			///< 闯黄灯抓拍张数
	unsigned int REVERSED:5;			///< 预留
}TRAFFIC_SNAPCNT;

/// 雷达配置扩展信息512字节
typedef struct TrafficRadarConfigExtended
{
	uint   raderRoadDis;		///< 雷达距离第一个车道的垂直距离，单位cm
	uint   roadWidth[TrafficMaxLanes];		///< 每个车道的宽度，单位cm
	int	reserved[119];
}TrafficRadarConfigExtended;

//雷达配置信息，其余信息由新组件处理
typedef struct Traffic_RadarConfig
{
	uint		angle;					///< 雷达的安装角度，   只针对俄罗斯雷达参数
	uint		limitSpeed[2];			///< 第一个元素为低限速，第二个元素为高限速，这个设置给相机，用来判定车辆是超速还是欠速，所有雷达类型共用此参数*/									
	uint		triggerSpeed;			///< 触发速度，设置到雷达中的数据， 范围  5~250, 默认为10，只针对俄罗斯雷达参数
	uchar		level;					///< 灵敏度，0级灵敏度最高	0~7，  默认为5，只针对俄罗斯雷达参数
	uchar		multiTargetFilter;		///< 多目标过滤模式	0-正常 1-过滤，  默认为1,只针对俄罗斯雷达参数
	uchar		detectMode;				///< 检测模式	0-车头检测 1-车尾检测 2-双向检测，默认为0，只针对俄罗斯雷达参数
	uchar		delayTime;				///< 雷达时延,  单位 ms ，范围0~60， 默认30，只针对俄罗斯雷达参数
	uchar		installMode;			///< 雷达安装方式, 1:   上方安装，0: 侧面安装， 默认为1，只针对俄罗斯雷达参数
	uchar		carway;					///< 车道号, 所有雷达类型共用此参数
	ushort		postiveGateInThr;		///< 来向进入门槛值， 范围0~7， 默认4， 只针对俄罗斯雷达参数
	ushort		postiveGateOutThr;		///< 来向离开门槛值，  范围0~7， 默认3， 这个值必须小于等于来向进入门槛值，只针对俄罗斯雷达参数
	ushort		converseGateInThr;		///< 去向进入门槛值，范围0~7， 默认4 只针对俄罗斯雷达参数
	ushort		converseGateOutThr;		///< 去向离开门槛值，范围0~7, 默认为3,  这个值必须小于等于去向进入门槛值，只针对俄罗斯雷达参数
	ushort		converseGateEndThr;		///< 去向信号结束门槛值，范围0~7， 默认为4，必须小于等于去向进入门槛值，只针对俄罗斯雷达参数
	ushort		reDisturbThr;			///< 抗干扰门槛值， 范围1~100， 默认69，只针对俄罗斯雷达
	uchar		radarType;				///< 雷达协议，1: dahua雷达2:俄罗斯雷达 3:川速雷达 4: 蓝盾雷达 5:安道雷达 6:腾飞雷达 7:惠仓雷达
	uchar		ConverseShield;			///< 屏蔽逆行是否标记为逆行违章类型，0: 不标记， 1: 标记逆行违章类型
	ushort		detectBreakingMask;		///< 违章类型掩码：0-正常 1-闯红灯 2-压线 3-逆行 4-欠速 5-超速 6-违章占道, 7-黄牌占道，8-闯黄灯
	uchar		saveParam;				///< 是否将当前配置保存到雷达的flash 中， 0: 不把配置保存到flash 中， 1: 保存参数到雷达flash 中
	uchar		roadEnable;				///< 当前车道使能 位:0-不使能，1-使能

	/**************************************************************
		 以下是定制化的雷达
	**************************************************************/
	union __RadarConfig
	{
		/***********************************************************
				蓝盾雷达配置
		***********************************************************/
		struct __TL_Radar_Config 
		{
			uchar	radarWorkMode;					///< 设置工作模式, 0: 静止平行1: 静止定角同向2:运动同向 3:静止定角反向 4: 测试模式
			uchar	AngleAdjust;					///< 本车角度校正, 范围0~45
			uchar	targetAngleAdjust;				///< 目标车角度校正， 范围0~45
			uchar	radarVga;						///< 增益控制范围0~7
			uchar	moveCarSensitition[2];			///< 运动本车灵敏度，第一个元素代表起始灵敏度，第二个元素代表结束灵敏度，范围1-255
			uchar	stillCarSensitition[2];			///< 静止目标灵敏度，范围1~255
			uchar	stillConvsCarSensitition[2];	///< 静止反向灵敏度,范围1~255
			uchar	moveSensitition[2];				///< 运动灵敏度,范围1~255
			uchar	AllVga;							///< 总增益， 范围0~2
			uchar	roadType;						///< 工作路段，0: 普通公路1:高速公路	
			uchar	pad[2];
			ushort	speedLimited[2];				///< 免抓拍范围，第一个元素代表低速，第二个元素代表高速
			uchar	reserved[8];					///< 保留字节
		}TL_Radar_Config;
		/*****************************************************************
				大华雷达配置
		*****************************************************************/
		struct __DH_Radar_Config
		{
			uint		radarSpeed[2];				///< 第一个元素是低限速，第二个元素是高限速， 设置到大华雷达中去的
			uchar		metersUints;				///< 速度单位， 0: 公里(默认)，1:英里
			uchar		sensitiveLevel;				///< 阈值，即灵敏度，范围0, 1, 2, 3, 4, 5, (0为最高阈值)
			uchar		preferTarget;				///< 首选目标，0: 最快1:最慢 2:最强(默认)
			uchar		detectMode;					///< 方向设定， 0: 前向来车，1:前向去车，2: 后向来车，3:后向去车，4: 前向双向, 5: 后向双向
			uchar		selfMode;					///< 本身模式，0: 静止(默认), 1:运动
			uchar		micoWaveHead;				///< 微波头挂起，0: 正常(默认) ,1: 挂起
			ushort		triggerSpeed;				///< 最低触发速度，默认10，区分大小车时作为小车触发速度
			ushort		interTimeval;				///< 目标最小间隔，默认200*/
			uchar		multiTargetFilter;			///< 多目标过滤选项，0: 正常(默认), 1: 过滤
			uchar		enableLowSpeed;				///< 限低速允许选项， 0: 不允许(默认), 1: 允许
			uchar		radarMode;					///< 工作模式，0: 单次发(默认)，1: 连续发，2:手持
			char		carSizeLimit;				///< 大小车限速开关，0-关闭，1-打开				
			uchar		speedLimitValue;			///< 限速值，单位：km/h，区分大小车时用于小车限速
			uchar		bigCarLimitValue;			///< 大车限速值，单位：km/h，区分大小车时启用
			uchar		bigCarTriggerValue;			///< 大车触发值，单位：km/h，区分大小车时启用
			uchar		angle;						///< 雷达的安装角度，范围0~45,  默认22度
			uchar		speedLimitForSize;				///< 大小车判断使能，0:不使能，1:使能
			uchar       		reserved[1];
		}DH_Radar_Config;
		/****************************************************************
				川速雷达配置
		*****************************************************************/
		struct __CS_Radar_Config
		{
			uchar		radarMode;				///< 工作模式, 0: 持续发送模式1: 触发发送模式
			uchar		triggerSpeed;			///< 触发门限, 范围1~240， 默认为30
			uchar		angle;					///< 角度修正,  角度修正范围: 0~70度，默认0度
			uchar		sensitive;				///< 设置灵敏度,  范围: 11~200, 默认32
			uchar		directMode;				///< 设置方向过滤，0:不过滤方向(默认) , 1: 只输出来向, 2: 只输出去向
			uchar		spdFormat;				///< 选择车速数据格式， 0: 单字节，1:  双字节, 2: ASIC格式
			uchar		limitSpd;				///< 低速下限调整， 范围: 1~20,  默认为5
			uchar		reserved[21];
		}CS_Radar_Config;
		/****************************************************************
				安道雷达
		*****************************************************************/
		struct __AD_Radar_Config
		{
			uchar		radarMode;				///工作模式,0:被动触发，1:主动轮询
		}AD_Radar_Config;
		uchar        otherConfig[28];
	}RadarConfig;

	TrafficRadarConfigExtended *extendedInfo;	///< 扩展信息	
	int			reversed[3];
}Traffic_RadarConfig;

/// 雷达信号检测器配置，1024字节
typedef struct TrafficRadarHubConfig 
{
	uchar roadnum;											///< 雷达个数
	uchar reserved1[3];										///< 保留
	Traffic_RadarConfig radarConfig[TrafficMaxLanes];		///< 雷达配置
	uint reserved[87];
}TrafficRadarHubConfig;

/// 抓拍模式
typedef enum Traffic_SnapMode
{
	SNAP_MODE_ALL,			///< 全部抓拍模式
	SNAP_MODE_SPEED_OVER,	///< 超速抓拍模式
	SNAP_MODE_CONVS_DIR,	///< 逆向抓拍模式
}Traffic_SnapMode;


/// 车道配置信息
typedef struct Traffic_CarDetectConfig
{
	Traffic_SnapMode	snapMode;			///< 抓拍模式
	uchar				coilsNumber;		///< 线圈个数
	uchar				roadNum;			///< 车道号，暂时用做车道抓拍使能的判断
	ushort				coilsWidth;			///< 线圈宽度, 40 ~ 200 (cm)
	uint				coilsDistance[2];	///< 本车道的线圈距离，若只有两个线圈，第二个元素无意义
	uint				limitSpeed[2];		///< 第一个元素为低限速，第二个元素为高限速
	struct 
	{
		uchar				triggerMode;				///< 触发模式0:关闭，1: 入线圈触发，2: 出线圈触发，3:入、出均触发
		uchar				flashSerialNum;				///< 每个线圈对应的闪关灯序号，值的范围，0~5， 其中0表示不打开闪关灯
		uchar				redDirection;				///< 每个线圈对应的红灯方向，0-不关联,1-左转红灯,2-直行红灯,3-右转红灯,4-待左,5-待直,6-待右,7-直行左转,8-直行右转 只在电警中有效 9-左转右转 10-直行左转右转11-掉头 12-直行掉头 13-左转掉头 14-右转掉头 15-左转直行掉头 16-右转直行掉头 17-左转右转掉头 18-左转直行右转掉头 19-掉头待行, 只在电警中有效
		uchar				delayFlashID;				///< 闯红灯下，需要给出每个车道的最后一个线圈号，设置延时，同时也要配置下延时的FLASHID
		uchar				reserved[4];
	}epConfig[6];							///< 前三个代表卡口配置, 后三个代表电警
	uchar	workMode;						///< 工作模式: 0,卡口式电警，1: 纯电警，2: 卡口 每个车道的工作模式会不一样
	uchar 	ConverseShield;					///< 屏蔽逆行是否标记为逆行违章类型，0: 不标记， 1: 标记逆行违章类型
	ushort	detectBreakingMask;				///< 违章类型掩码：0-正常 1-闯红灯 2-压线 3-逆行 4-欠速 5-超速 6-违章占道，7-黄牌占道， 8-闯黄灯
	union __specialCarConfig
	{
		struct __TL_CarConfig
		{
			uchar			coilSensitition;			///< 线圈灵敏度,  对车道内的所有线圈有效，最多2个线圈
			uchar			coilExistDuration;			///< 线圈存在时间， 默认值255， 对本车道内所有线圈有效
			uchar			coilTriggerMode;			///< 线圈触发方式,  从bit0 到 bit7,  每两个比特位的值代表一个线圈，如: bit1bit0: 00: 不触发01:上升沿触发 10: 下降沿触发11: 上下沿触发
			uchar			coilIoMode;					///< 线圈输出IO方式从bit0 到 bit7,  每两个比特位的值代表一个线圈，如: bit1bit0: 00: 下降沿,01:低电平 ,10: 上升沿,11:高电平
			uchar			coilIoRelation;				///< 线圈的输入IO与对应通道关系, 从bit0 到 bit7,  每两个比特位的值代表一个线圈，
														///< 如: bit1bit0: 00: 低电平-无逻辑关系,01:低电平-有逻辑与关系，10: 高电平-无逻辑关系,11:高电平-有逻辑与关系
			uchar			coilWorkMode;				///< 线圈卡工作模式， 0: 单线圈工作模式，1: 双线测速，2: 双线圈交通模式
			uchar			triggerMode;				///< 线圈抓拍时机,  从bit0 到bit7, 每两个比特位的值代表一个线圈，如: bit1bit0: 00: 不触发，01: 入线圈触发10: 出线圈触发11:入出线圈都触发
			uchar			coilID;						///< ID，默认为0
		}TL_CarConfig;
		struct __TC_CarConfig
		{
			uchar			directionCode;				///< 方向码，取值0~3
		}TC_CarConfig;
		struct __SH_CarConfig
		{
			uint			midDistance;				///上海电警，最后一个线圈距离路口中间的距离，单位厘米
		}SH_CarConfig;
		uchar reserved[8];
	}specialCarConfig;
}Traffic_CarDetectConfig;

/// 设备支持的协议类型
typedef enum  Traffic_SnapProtocol
{
	CAP_RADAR_PTL,		///< 雷达协议
	CAP_SIGNAL_PTL,		///< 信号检测器协议
	CAP_CAR_PTL,		///< 车检器协议
	CAP_IO_PTL,			///< IO协议
	CAP_ZJ_PTL,			///< 镇江车检器协议
	CAP_TL_PTL,			///< 铜陵车检器协议
	CAP_A_PTL,			///< 闪光灯分路协议
	CAP_B_PTL,			///< RS12B协议
	CAP_C_PTL,			///< 海南光信
	CAP_VIDEO_PTL,		///< 纯视频协议
	CAP_NET_PTL,		///< 网络抓拍协议    
	CAP_RADARHUB_PTL,	///< 雷达信号检测器
	CAP_ZK_PTL,			///< 中控车检器协议
	CAP_TC_PTL,			///< 同创车检器协议
	CAP_BK_PTL,			///< 宝康控制板协议	
	CAP_KH_PTL,			///< 江西科环车检器
	CAP_SD_PTL,			///< 桑达车检器
	CAP_RGLIGHT_PTL,	///< 红绿灯检测器协议
	CAP_SDEP_PTL,		///< 桑达信号检测器
	CAP_RZ_PTL,			///< 仁智车检器
	CAP_XS_PTL,			///< 熙盛信号检测器
	CAP_JP_PTL,			///< 金鹏电子车检器
	CAP_SB_PTL,			///< 三宝车检器
	CAP_SBEP_PTL,		///< 三宝信号检测器
	CAP_RGLIGHT_B_PTL,	///< 红绿灯检测器协议2，支持黄灯信号
	CAP_SIGNAL_C_PTL,	///< RS12c协议, 支持黄灯信号
	CAP_HKVS_PTL,       ///< 海康威视检测器
	CAP_UNKNOW
}Traffic_SnapProtocol;

/// 抓拍模式
typedef enum Traffic_SnapType
{
	SNAP_TYPE_ONESHOT,		///< 正常抓拍模式
	SNAP_TYPE_FROM_VIDEO,	///< 视频抓拍模式
	SNAP_TYPE_NO_VIDEO,		///< 黑屏快抓模式
}Traffic_SnapType;

/// 帧间隔模式
typedef enum Traffic_FrameMode
{
	FRAME_STABLE,		///< 固定帧间隔模式
	FRAME_ADAPTIVE,		///< 自适应帧间隔模式
}Traffic_FrameMode;

/// 抓拍选项
typedef struct __Traffic_SnapOption
{
	uchar interFrame;	///< 抓拍帧间隔, 只是用于抓录模式
	uchar snapCnt;		///< 抓拍张数
	uchar pad[2];
}Traffic_SnapOption;

typedef struct _DH_TIME_TIMEVAL
{
	uint tv_sec;
	uint tv_msec;
}DH_TIME_TIMEVAL;


/*****************************************************************
		车道的属性，譬如属于这个车道的速度
		误差，速度百分比
*****************************************************************/
typedef struct _DH_ROADWAY_INFO
{
	uchar   ErrorRange;			///< 速度误差值	进线圈2与进线圈3之间的速度误差值，
								///< 若实际误差大于或等于该值，视速度无效，否则取平均速度，
								///< 默认的速度误差是4, 范围: 0~20
	uchar   OverPercentage;		///< 超速百分比，超过限速百分比后抓拍,  默认10, 范围: 0~40
	uchar   CorrectPercenTage;	///< 速度修正百分比，范围: 1~200
	uchar   reserved[9];
}DH_ROADWAY_INFO;

// typedef enum 

/// 车道扩展属性,128字节
typedef struct DH_ROADWAY_EXT_INFO
{
	uchar speedLimitForSize;			///< 是否区分大小车,0:不区分，1:区分
	uchar sensFlag;						///< 提高抓拍灵敏度标记，0 不提高  1 提高
	uchar reserved1[2];
	ushort bigCarSpeedLimit[2];			///< 大车限速值
	int reserved[30];
}DH_ROADWAY_EXT_INFO;

/// 整个智能交通抓拍的配置信息，1024字节
typedef struct TrafficSnapConfig
{
	Traffic_FrameMode		frameMode;						///< 帧模式
	Traffic_SnapType		snapType;						///< 抓拍或抓录模式
	Traffic_SnapOption		option;
	uchar					manualMode;						///< 手动抓拍， 0:  关； 1: 开
	uchar					snapEnable;						///< 1:true 抓拍允许 0:false不抓拍
	uchar					pad[2];
	uint					adaptSpeed[2];					///< 自适应值，第一个元素为低速值，第二个元素为高速值
	Traffic_RadarConfig		radarCfg;						///< 雷达配置
	Traffic_CarDetectConfig	carDetectCfg[TrafficMaxLanes];	///< 车检器有暂定8个车道
	uchar					snapTypeMode;					///< 0:自动模式，1: 线圈抓拍 2:线圈识别，3：视频抓拍 4:视频识别模式， 对于底层来说，其实这个值没什么作用了	  
	uchar					CarTypeMode;					///< 0: 大小车都抓拍，1: 抓拍小车 2:抓拍大车 3:大小车都不抓拍 
	ushort					CarThreShold;					///< 区分大小车长的阈值， 单位: cm 
	TRAFFIC_SNAPCNT			snapCntMask;					///< 每种违章类型对应的抓拍张数
	DH_ROADWAY_INFO			roadway[TrafficMaxLanes];		///< 每个车道的属性值
	ushort					maxspeed;						///< 当前相机配置的最大速度，实际计算出来的速度若大于此值，用这个值取代实际计算的速度
	uchar					openAlarmEvent;					///< 是否开启车辆驶过的报警事件， 0: 不开启，1: 开启，默认为0
	uchar					redLightMargin;					///< 红灯容许间隔时间，单位秒
	ushort					keepAlive;						///< 与雷达,车检器等外设的默认保活周期, 单位 s 
	uchar					IOTrigger;						///< 协议配置为IO才有效: 0: 上升沿触发； 1: 下降沿触发，默认上升沿触发
	uchar					IOInterval;						///< 协议配置IO才有效设置给FPGA的定时器值，主要是去抖动IO触发的时间间隔， 单位10ms,  范围10~200, 默认15 
	TrafficRadarHubConfig	*radarHub;						///< 雷达信号检测器的配置
	uchar					roadNumber;						///< 车道个数
	uchar					timeSnapEnable;					///< 定时抓拍使能 ,用于上层对亮度的采样，图片不上传，mark值为0x20来做标识
	ushort					timeIntervalSnap;				///< 定时抓拍的时间间隔，单位s
	DH_ROADWAY_EXT_INFO		*extInfo;						///< 车道扩展属性
	int						reserved[30];					///< 保留
}Traffic_SnapConfig;


/// 抓拍类型
typedef enum __PeccancyType
{
	RADAR_SPEED_OVER,		///< 雷达高限速
	RADAR_SPEED_LOW,		///< 雷达低限速
	CARDETECT_SPEED_OVER,	///< 车检器高限速
	CARDETECT_SPEED_LOW,	///< 车检器低限速
	CONVERSE_DIRECTION,		///< 逆向
	BREAK_RED,				///< 闯红灯
	RED_LIGHT_ON,			///< 红灯亮
	RED_LIGHT_OFF,			///< 红灯灭
	SNAP_ALL,				///< 全部抓拍或者卡口
	RADAR_SPEED_MIDDLE,		///< 雷达速度在高限速和低限速之间
	CARDETECT_SPEED_MIDDLE,	///< 车间器速度在高限速和低限速之间
	OCOUPY_WAY,				///< 有车占道违法代码
	CONVERSE_NOT_MARK,		///< 逆行不标记
	MANUAL_ALL,				///< 手动抓拍类型
	INBLACKLIST,			///< 被列入黑名单
	NOPASSING,				///< 禁止行驶
	YELLOW_OCOUPY,			///< 黄牌占道
	BREADK_YELLOW,			///< 闯黄灯
	PeccancyTypeCount		///< 违章总数
}PeccancyType;

/// 故障信息
typedef enum __TrafficAlarmType
{
	TRAFFIC_JAM = 1,			///< 道路拥挤
	TRAFFIC_ABNORMAL,			///< 道路异常或空闲
	TRAFFIC_COIL_FAULT,			///< 线圈车检器故障
	TRAFFIC_FLASH_LIGHT_FAULT,	///< 补光设备故障
	TRAFFIC_NORMAL,				///< 道路正常
	TRAFFIC_COIL_NORMAL,		///< 线圈车间器正常
	TRAFFIC_FLASH_LIGHT_NORMAL,	///< 补光灯正常
	TRAFFIC_CAR_PASS,			///< 车辆驶过事件，但不抓拍
	TRAFFIC_OTHER_FAULT,		///< 其他故障
	TRAFFIC_DATA485				///< 485数据传输
}TrafficAlarmType;


/// 底层通知新组件的报警信息
typedef struct Traffic_Alarm_Info
{
	TrafficAlarmType 	alarmType;			///< 报警代码， 包括车辆驶过但不抓拍事件
	DH_TIME_TIMEVAL 	alarmTime;			///< 报警时间， 包括车辆驶过时间
	uchar				alarmAppend;		///< 报警附加值，当alarmType 为车辆驶过事件时，此值代表速度值
	uchar				trafficJamLevel;	///< 拥塞等级
	uchar				coilFaultID;		///< 线圈故障ID
	uchar				resv[5];			///< 保留字段
}Traffic_Alarm_Info;

///中盟的车检器过车码
typedef struct Zhong_Kong_Packet
{
	uchar packet[8];	
}Zhong_Kong_Packet;

/// 每个抓拍信号的属性信息
typedef struct Traffic_SnapSignal_Info
{
	uint			speed; 				///< 当前车道的速度
	PeccancyType	type; 				///< 当前车道的抓拍类型
	DH_TIME_TIMEVAL	redTime;			///< 当前车道红灯或黄灯时间点亮时间，红灯违章为红灯点亮时间，黄灯违章则为黄灯点亮时间
	DH_TIME_TIMEVAL	capTime;			///< 当前车道的抓拍时间（带毫秒数）
	uint			PicIdTime;			///< 每次抓拍的图片对应的ID号和抓拍时间，主要用于后台的各个相机抓拍实际匹配
	uchar			carLength;			///< 当前车道的的车长